package com.tony.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;


/**
 * 时间格式处理/计算工具类
 * @className DateUtil
 * @todo TODO
 * @author wzx
 * @time 2016-11-15 下午5:58:18
 */
public class DateUtil {


	public static String format(long j, String str) {
		return new SimpleDateFormat(str).format(new Date(j));
	}

	public static String randomDate(String minDate,String maxDate){
		long minTimes=getTimesByDate(minDate);
		long maxTimes=getTimesByDate(maxDate);
		long rangeLong = minTimes + (((long) (new Random().nextDouble() * (maxTimes - minTimes))));
		String result=getDateByTimes(rangeLong);
		System.out.println(result);
		return result;
	}



	public static String getDateByLongTimes(long times){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
	    
	    String d = format.format(times);  
	    try {
			Date date=format.parse(d);
			return format.format(date); 
		} catch (ParseException e) {
			e.printStackTrace();
		}  
		
		return "";
	}
	
	/**
	 * 获取当前的时间，字符串格式：2017-06-22 12:13:25
	 * 2017年6月22日下午5:00:15
	 * @author 王清华
	 * @return
	 */
	public static String getCurrentDateTime(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
		return sDateFormat.format(new Date()); 
	}

	public static String getCurrentDateTimes(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
		return sDateFormat.format(new Date());
	}

	/**
	 * 获取当前的日期，字符串格式：2017-06-22
	 * 2017年6月22日下午5:00:45
	 * @author 王清华
	 * @return
	 */
	public static String getCurrentDate(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyy-MM-dd");   
		return sDateFormat.format(new Date()); 
	}
	
	
	
	public static String getFolderDate(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("yyyyMMdd");   
		return sDateFormat.format(new Date()); 
	}
	
	
	public static String getOrderDate(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("yyMMddHHmmss");   
		return sDateFormat.format(new Date()); 
	}
	
	/**
	 * 获取当前的时间，24时计时法：15:33:12
	 * 2017年6月22日下午5:01:12
	 * @author 王清华
	 * @return
	 */
	public static String getCurrentTime(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("HH:mm:ss");   
		return sDateFormat.format(new Date()); 
	}
	/**
	 * 获取当前的小时，24时计时法：15
	 * 2017年6月22日下午5:01:45
	 * @author 王清华
	 * @return
	 */
	public static String getCurrentHour(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("HH");   
		return sDateFormat.format(new Date()); 
	}

	public static String getCurrentMin(){
		SimpleDateFormat sDateFormat=new SimpleDateFormat("mm");
		return sDateFormat.format(new Date());
	}

	/**
	 * 将时间戳转变为字符串格式的时间：2017-06-22 12:15:35
	 * 2017年6月22日下午5:02:26
	 * @author 王清华
	 * @param times
	 * @return
	 */
	public static String getDateTimesByTimes(long times){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
	    
	    String d = format.format(times);  
	    try {
			Date date=format.parse(d);
			return format.format(date); 
		} catch (ParseException e) {
			e.printStackTrace();
		}  
		
		return "";
	}

	public static String getDateByTimes(long times){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

		String d = format.format(times);
		try {
			Date date=format.parse(d);
			return format.format(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return "";
	}


	/**
	 * 将没有时间点的日期转化为时间戳
	 * 2017年6月22日下午5:03:15
	 * @author 王清华
	 * @param date 2017-06-22
	 * @return
	 */
	public static long getTimesByDate(String date){
		
		try {
	        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
	        Date d= simpleDateFormat.parse(date);
			long ts = d.getTime();
			return ts;
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
	
	/**
	 * 将具体的日期时间转化为时间戳
	 * 2017年6月22日下午5:03:45
	 * @author 王清华
	 * @param date 2017-06-22 15:33:25
	 * @return
	 */
	public static long getTimesByDateTime(String date){
		
		try {
	        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        Date d= simpleDateFormat.parse(date);
			long ts = d.getTime();
			return ts;
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
	
	/**
	 * 将没有时间的日期按照当前日期的最早时间转化为时间戳
	 * 2017年6月22日下午5:04:48
	 * @author 王清华
	 * @param date
	 * @return
	 */
	public static long getTimesByDateFirst(String date){
		
		try {
	        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        Date d= simpleDateFormat.parse(date+" 00:00:00");
			long ts = d.getTime();
			return ts;
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
	
	/**
	 * 将没有时间的日期按照当前日期的最晚时间转化为时间戳
	 * 2017年6月22日下午5:05:40
	 * @author 王清华
	 * @param date
	 * @return
	 */
	public static long getTimesByDateLast(String date){
		
		try {
	        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	        Date d= simpleDateFormat.parse(date+" 23:59:59");
			long ts = d.getTime();
			return ts;
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}
	
	public static void main(String[] args){
		System.out.println(getCurrentMin());
	}
	
	public enum DateType{
		Second, Minute, Hour, Day, Month, Year
	}
	
	public enum Week{
		Sunday, Monday, Tuesday,Wednesday,Thursday,Friday,Saturday
	} 

	/**
	 * 字符串转时间格式
	 * @method str2Date
	 * @author wzx
	 * @time 2016-11-15 下午5:59:50
	 * @return
	 */
	public static Date str2Date(String date, String format){
		if(!TextUtil.isEmpty(date)){
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			try {
				return sdf.parse(date);
			} catch (ParseException e) {
				e.printStackTrace();
				return null;
			}
		}else{
			return null;
		}
	}

	/**
	 * 字符串转时间，默认格式"yyyy-MM-dd HH:mm:ss"
	 * @method str2Date
	 * @author wzx
	 * @time 2016-11-15 下午6:01:34
	 * @param date
	 * @return
	 */
	public static Date str2Date(String date){
		return str2Date(date,"yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 时间转字符串
	 * @method date2String
	 * @author wzx
	 * @time 2016-11-15 下午6:04:55
	 * @param date
	 * @param format
	 * @return
	 */
	public static String date2String(Date date, String format){
		if(date!=null){
			SimpleDateFormat sdf = new SimpleDateFormat(format);
			return sdf.format(date);
		}else{
			return "";
		}
	}

	/**
	 * 时间转字符串，默认格式"yyyy-MM-dd HH:mm:ss"
	 * @method date2String
	 * @author wzx
	 * @time 2016-11-15 下午6:07:22
	 * @param date
	 * @return
	 */
	public static String date2String(Date date){
		return date2String(date, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 时间戳转成时间字符串
	 * @method stamp2Date
	 * @author wzx
	 * @time 2016-11-15 下午6:08:31
	 * @param stamp
	 * @return
	 */
	public static String stamp2DateStr(String stamp, String format){
		try{
			if(TextUtil.isEmpty(stamp)){
				return null;
			}
			SimpleDateFormat sdf=new SimpleDateFormat(format);  
			String time = sdf.format(new Date(Long.parseLong(stamp.trim())*1000));  
			return time;
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 时间戳转时间字符串，默认格式"yyyy-MM-dd HH:mm:ss"
	 * @method stamp2DateStr
	 * @author wzx
	 * @time 2016-11-16 上午9:20:20
	 * @param stamp
	 * @return
	 */
	public static String stamp2DateStr(String stamp){
		return stamp2DateStr(stamp, "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 时间戳转时间，默认格式"yyyy-MM-dd HH:mm:ss"
	 * @method stamp2Date
	 * @author wzx
	 * @time 2016-11-16 上午9:24:51
	 * @param stamp
	 * @return
	 */
	public static Date stamp2Date(String stamp){
		String date = stamp2DateStr(stamp);
		return str2Date(date);
	}

	/**
	 * 时间戳转时间
	 * @method stamp2Date
	 * @author wzx
	 * @time 2016-11-16 上午9:27:00
	 * @param stamp
	 * @param format
	 * @return
	 */
	public static Date stamp2Date(String stamp, String format){
		String date = stamp2DateStr(stamp);
		return str2Date(date, format);
	}

	/**
	 * 时间字符串转时间戳，默认格式"yyyy-MM-dd HH:mm:ss"
	 * @method date2Stamp
	 * @author wzx
	 * @time 2016-11-16 上午9:23:14
	 * @param date
	 * @return
	 */
	public static String date2Stamp(String date){
		if(TextUtil.isEmpty(date)){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		try {
			return String.valueOf(sdf.parse(date).getTime()/1000);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 时间字符串转时间戳
	 * @method date2Stamp
	 * @author wzx
	 * @time 2016-11-16 上午9:29:05
	 * @param date
	 * @param format
	 * @return
	 */
	public static String date2Stamp(String date, String format){
		if(TextUtil.isEmpty(date)){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);  
		try {
			return String.valueOf(sdf.parse(date).getTime());
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 时间转时间戳
	 * @method date2Stamp
	 * @author wzx
	 * @time 2016-11-16 上午9:32:06
	 * @param date
	 * @return
	 */
	public static String date2Stamp(Date date){
		String dateStr = date2String(date);
		return date2Stamp(dateStr);
	}

	/**
	 * 获取时间
	 * @method getDate
	 * @author wzx
	 * @time 2016-11-16 上午9:40:48
	 * @param date
	 * @param type
	 * @param number
	 * @return
	 */
	public static Date getDate(Date date, DateType type, Integer number){
		try{
			if(date==null){
				return null;
			}
			Calendar cal=Calendar.getInstance();
			cal.setTime(date);
			switch(type){
			case Second:{
				cal.add(Calendar.SECOND, number);
				break;
			}
			case Minute:{
				cal.add(Calendar.MINUTE, number);
				break;
			}
			case Hour:{
				cal.add(Calendar.HOUR_OF_DAY, number);
				break;
			}
			case Day:{
				cal.add(Calendar.DAY_OF_YEAR, number);
				break;
			}
			case Year:{
				cal.add(Calendar.YEAR, number);
				break;
			}
			default:
				break;
			}
			return cal.getTime();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}

	}

	/**
	 * 获取当天时间，0时0分0秒0毫秒
	 * @method getDayStart
	 * @author wzx
	 * @time 2016-11-16 上午9:44:25
	 * @param date
	 * @return
	 */
	public static Date getDayStart(Date date){
		try{
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			cal.set(Calendar.HOUR_OF_DAY, 0);
			cal.set(Calendar.MINUTE, 0);
			cal.set(Calendar.SECOND, 0);
			cal.set(Calendar.MILLISECOND, 0);     
			return cal.getTime();
		}
		catch(Exception e){
			return null;
		}
	}
	
	/**
	 * 获取当天时间，23时59分59秒0毫秒
	 * @method getDayEnd
	 * @author wzx
	 * @time 2016-11-16 上午9:46:00
	 * @param date
	 * @return
	 */
	public static Date getDayEnd(Date date){
		try{
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			cal.set(Calendar.HOUR_OF_DAY, 23);
			cal.set(Calendar.MINUTE, 59);
			cal.set(Calendar.SECOND, 59);
			cal.set(Calendar.MILLISECOND, 0);     
			return cal.getTime();
		}
		catch(Exception e){
			return null;
		}
	}
	
	/**
	 * 获取指定时间所在周的开始时间（星期日）
	 * @method getMonDay
	 * @author wzx
	 * @time 2016-11-16 上午9:48:43
	 * @param date
	 * @return
	 */
	public static Date getWeekStart(Date date){
		try{
			if(date==null)
				return null;
			Calendar calendar=Calendar.getInstance();
			calendar.setTime(date);
			int week = calendar.get(Calendar.DAY_OF_WEEK);
			return getDate(date, DateType.Day, 1-week);
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 获取指定时间所在周的结束时间（星期六）
	 * @method getWeekStart
	 * @author wzx
	 * @time 2016-11-16 上午10:00:49
	 * @param date
	 * @return
	 */
	public static Date getWeekEnd(Date date){
		try{
			if(date==null)
				return null;
			Calendar calendar=Calendar.getInstance();
			calendar.setTime(date);
			int week = calendar.get(Calendar.DAY_OF_WEEK);
			return getDate(date, DateType.Day, 7-week);
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 获取本月开始的时间
	 * @method getMonthStart
	 * @author wzx
	 * @time 2016-11-16 上午10:05:40
	 * @param date
	 * @return
	 */
	public static Date getMonthStart(Date date){
		try{
			if(date==null)
				return null;
			Calendar c = Calendar.getInstance();  
			c.setTime(date);
			c.add(Calendar.MONTH, 0);
			c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
			return c.getTime();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 获取本月结束时间
	 * @method getMonthEnd
	 * @author wzx
	 * @time 2016-11-16 上午10:06:24
	 * @param date
	 * @return
	 */
	public static Date getMonthEnd(Date date){
		try{
			if(date==null)
				return null;
			Calendar c = Calendar.getInstance();    
			c.setTime(date);
			c.add(Calendar.MONTH, 0);
			c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));  
			return c.getTime();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	
	}
	
	/**
	 * 上个月开始时间
	 * @method getLastMonthStart
	 * @author wzx
	 * @time 2016-11-16 上午10:38:02
	 * @param date
	 * @return
	 */
	public static Date getLastMonthStart(Date date){
		try{
			if(date==null)
				return null;
			Calendar c = Calendar.getInstance();  
			c.setTime(date);
			c.add(Calendar.MONTH, -1);
			c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
			return c.getTime();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 上个月结束时间
	 * @method getLastMonthEnd
	 * @author wzx
	 * @time 2016-11-16 上午10:37:16
	 * @param date
	 * @return
	 */
	public static Date getLastMonthEnd(Date date){
		try{
			if(date==null)
				return null;
			Calendar c = Calendar.getInstance();    
			c.setTime(date);
			c.add(Calendar.MONTH, -1);
			c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));  
			return c.getTime();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 下个月开始时间
	 * @method getNextMonthStart
	 * @author wzx
	 * @time 2016-11-16 上午10:41:22
	 * @param date
	 * @return
	 */
	public static Date getNextMonthStart(Date date){
		try{
			if(date==null)
				return null;
			Calendar c = Calendar.getInstance();  
			c.setTime(date);
			c.add(Calendar.MONTH, 1);
			c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
			return c.getTime();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 下个月结束时间
	 * @method getNextMonthEnd
	 * @author wzx
	 * @time 2016-11-16 上午10:37:26
	 * @param date
	 * @return
	 */
	public static Date getNextMonthEnd(Date date){
		try{
			if(date==null)
				return null;
			Calendar c = Calendar.getInstance();    
			c.setTime(date);
			c.add(Calendar.MONTH, 1);
			c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));  
			return c.getTime();
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 获取当前日期是星期几
	 * @method getDayWeek
	 * @author wzx
	 * @time 2016-11-16 上午10:10:13
	 * @param date
	 * @return
	 */
	public static Week getDayWeek(Date date){
		if(date==null){
			return null;
		}
		Calendar calendar=Calendar.getInstance();
		calendar.setTime(date);
		int DAY_OF_WEEK = calendar.get(Calendar.DAY_OF_WEEK)-1; 
		Week[] w = Week.values();
		return w[DAY_OF_WEEK];
	}
	
	/**
	 * 获取当前日期是本月第几天
	 * @method getDayMonth
	 * @author wzx
	 * @time 2016-11-16 上午10:44:45
	 * @param date
	 * @return
	 */
	public static Integer getDayMonth(Date date){
		try{
			if(date==null){
				return null;
			}
			Calendar calendar=Calendar.getInstance();
			calendar.setTime(date);
			int DAY_OF_MONTH = calendar.get(Calendar.DAY_OF_MONTH); 
			return DAY_OF_MONTH;
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	/**
	 * 获取两个时间相隔几天
	 * @method getDayBetween
	 * @author wzx
	 * @time 2016-11-16 上午10:47:28
	 * @param minDate
	 * @param maxDate
	 * @return
	 */
	public static Integer getDayBetween(Date minDate, Date maxDate){
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");  
		try {
			minDate=sdf.parse(sdf.format(minDate));
			maxDate=sdf.parse(sdf.format(maxDate));  
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}          
		Calendar cal = Calendar.getInstance();    
		cal.setTime(minDate);    
		long time1 = cal.getTimeInMillis();                 
		cal.setTime(maxDate);    
		long time2 = cal.getTimeInMillis();         
		long between_days=(time2-time1)/(1000*3600*24);     
		return Integer.parseInt(String.valueOf(between_days)); 
	}
	
	/**
	 * 获取当前日期是本年第几天
	 * @method getDayYear
	 * @author wzx
	 * @time 2016-11-16 上午11:11:07
	 * @param date
	 * @return
	 */
	public static Integer getDayYear(Date date){
		try{
			if(date==null){
				return null;
			}
			Calendar calendar=Calendar.getInstance();
			calendar.setTime(date);
			int DAY_OF_YEAR = calendar.get(Calendar.DAY_OF_YEAR); 
			return DAY_OF_YEAR;
		}
		catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}

}
